/// 文件描述符


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
/// 验证 0 为键盘文件
//int main()
//{	
//	printf("进入第一次输入 :\n");
//	int a = 0;
//	scanf("%d",&a);
//	printf("%d\n",a);
//	close(0);
//	printf("进入第二次输入 :\n");
//	int b = 10;
//	scanf("%d",&b);
//	printf("%d\n",b);
//	
//	return 0;
//}


/// 验证 1 为显示器文件 , stdout

//int main()
//{
//	printf("我默认在显示器上打印\n"); // 默认是在 stdout 
//	close(1);
//		
//	printf("我默认在显示器上打印\n"); // 默认是在 stdout 
//	return 0;
//}

///// fd 分配原则
//int main()
//{
//	//close(0);
//	//int fd = open("log.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);	
//	//printf("fd : %d\n",fd);
//	
//	//close(2);
//	//int fd = open("log.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);	
//	//printf("fd : %d\n",fd);
//
//		
//	int fd = open("log.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);	
//	printf("fd : %d\n",fd);
//	
//	return 0;
//}



//////////////////////  重定向原理


///// 输出重定向现象 
//int main()
//{	
//	// 演示输出重定向现象 , 即 1 -- 对于 stdout
//	// 关闭 1 对于的文件 , 即 : 关闭显示器文件
//	close(1);
//
//	int fd = open("redir.txt" , O_CREAT|O_WRONLY | O_APPEND , 0666);
//	
//	//打印 , 默认打印到显示器 ; 但当关闭 stdout 文件后 , 会打印到 redir.txt 中 
//	printf("I am file , defalut printf to stdout\n");
//	
//	
//	return 0;
//}
//
//


///// 输出重定向原理 :  打开方式 + dup2 , 即 : >  , O_WRONLY 

// ls > xxx , 往 xxx 写入
//int main()
//{
//	int fd = open("dir.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);
//	
//	// old , new , 新的指向旧的 
//	dup2(fd , 1); // 1 本身指向的是显示器文件 , 在 C语言中为 : stdout , 现在指向 fd 
//	
//	printf("Hello newfile\n");
//	const char* str = "dir success!\n";
//	write(1 , str , strlen(str));
//
//	close(fd); 
//	
//	return 0;
//}
//



////// 输入重定向原理 

// ls < xxx , 从 xxx 读取内容
//int main()
//{
//	int fd = open("dir.txt" , O_RDONLY);
//	
//	dup2(fd , 0); // 0 原来指向键盘文件 , 默认从键盘上读取内容, 现在指向 dir.txt 
//	
//	char buff[200];
//	memset(buff , 0 , sizeof(buff));
//	//读 fd 文件	
//	while(1)	
//	{	
//		// 从 0 指向的设备文件中读 
//		ssize_t red = read(0 , buff , sizeof(buff)-1);	// 不读 \0 l 
//
//		if(red > 0)
//		{
//			buff[red] = 0;
//			printf("%s\n",buff);	
//		}		
//		if(red == 0 )
//		{
//			break;
//		}
//	
//	}
//	
//	
//	return 0;
//}



///////// 追加输出重定向
// ls >> xxx , 往 xxx 写入
int main()
{
	int fd = open("dir.txt" , O_CREAT | O_WRONLY | O_APPEND , 0666);
	
	// old , new , 新的指向旧的 
	dup2(fd , 1); // 1 本身指向的是显示器文件 , 在 C语言中为 : stdout , 现在指向 fd 
	
	printf("Hello newfile\n");
	const char* str = "dir success!\n";
	write(1 , str , strlen(str));

	close(fd); 
	
	return 0;
}
